package com.theme.common.office.excel;


import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * @name: Java POI导出Excl个人简历，单元格合并、插入图片等 <tb>
 * @title: https://blog.csdn.net/u012998306/article/details/95063920  <tb>
 * @author: cuixinfu@51play.com <tb>
 * @date: 2020/9/27 17:32 <tb>
 */

public class MyImageExcel {
    public static void main(String[] args) {
        FileOutputStream fileOut = null;
        BufferedImage bufferImg = null;
        //先把读进来的图片放到一个ByteArrayOutputStream中，以便产生ByteArray
        try {
            ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
            bufferImg = ImageIO.read(new File("E:/测试文件/excel/avatar.jpg"));
            ImageIO.write(bufferImg, "jpg", byteArrayOut);

            HSSFWorkbook wb = new HSSFWorkbook();
            HSSFSheet sheet1 = wb.createSheet("自定义图片");
            // 利用HSSFPatriarch将图片写入EXCEL
            HSSFPatriarch patri_item = sheet1.createDrawingPatriarch();
            /**
             * 创建一个新的客户端锚，并设置左上角和右下角 锚点的坐标。
             * @param dx1第一个单元格内的x坐标。
             * @param dy1第一个单元格内的y坐标。
             * @param dx2第二个单元格内的x坐标。
             * @param dy2第二个单元格内的y坐标。
             * @param col1第一个单元格的列（从0开始）。右上角点
             * @param row1第一个单元格的行（从0开始）。右下角点
             * @param col2第二个单元格的列（从0开始）。左下角点 宽度
             * @param row2第二个单元格的行（从0开始）。左上角点 高度
             * dx1、dy1定义了该图片在开始cell的起始位置，dx2、dy2定义了在终cell的结束位置。col1、row1定义了开始cell、col2、row2定义了结束cell。
             */
            //HSSFClientAnchor anchor_item = new HSSFClientAnchor(0, 0, 0, 0, (short ) 4, 1, (short) 6, 6);
            HSSFClientAnchor anchor_item = new HSSFClientAnchor(0, 0, 0, 0, (short) 4, 0, (short) 6, 2);
            patri_item.createPicture(anchor_item, wb.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));

            fileOut = new FileOutputStream("E:\\测试文件\\Excel\\自定义图片.xls");
            // 写入excel文件
            wb.write(fileOut);
            System.out.println("----Excle文件已生成------");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fileOut != null) {
                try {
                    fileOut.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * @title: Java从网络读取图片并保存至本地 <tb>
     * @author: cuixinfu@51play.com <tb>
     * @date: 2020/9/28 10:18<tb>
     */
    public static String getHttpImageDowloadLocal() throws Exception {
        //new一个URL对象
        URL url = new URL("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1601269380944&di=24ef224096f6e0472ea54691a8243ca2&imgtype=0&src=http%3A%2F%2Ft8.baidu.com%2Fit%2Fu%3D1484500186%2C1503043093%26fm%3D79%26app%3D86%26f%3DJPEG%3Fw%3D1280%26h%3D853");
        //打开链接
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        //设置请求方式为"GET"
        conn.setRequestMethod("GET");
        //超时响应时间为5秒
        conn.setConnectTimeout(5 * 1000);
        //通过输入流获取图片数据
        InputStream inStream = conn.getInputStream();
        //得到图片的二进制数据，以二进制封装得到数据，具有通用性
        byte[] data = readInputStream(inStream);
        //new一个文件对象用来保存图片，默认保存当前工程根目录
        String fileUrl = "E:/测试文件/excel/pic20170419.jpg";
        File imageFile = new File(fileUrl);
        //创建输出流
        FileOutputStream outStream = new FileOutputStream(imageFile);
        //写入数据
        outStream.write(data);
        //关闭输出流
        outStream.close();
        return fileUrl;
    }

    public static byte[] readInputStream(InputStream inStream) throws Exception {
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        //创建一个Buffer字符串
        byte[] buffer = new byte[1024];
        //每次读取的字符串长度，如果为-1，代表全部读取完毕
        int len = 0;
        //使用一个输入流从buffer里把数据读取出来
        while ((len = inStream.read(buffer)) != -1) {
            //用输出流往buffer里写入数据，中间参数代表从哪个位置开始读，len代表读取的长度
            outStream.write(buffer, 0, len);
        }
        //关闭输入流
        inStream.close();
        //把outStream里的数据写入内存
        return outStream.toByteArray();
    }

}